\section*{Aufgabe 3}
\label{sec:aufgabe-3}

\subsection*{Augabenstellung}
\begin{enumerate}
\item \label{ta1} Überlegen Sie sich ein Verfahren, wie Sie zu den
  Tracks in der Mediathek die passende KomponistIn in Ihrer Datenbasis
  finden können. Beachten Sie dabei, dass die Schreibweise der
  KomponistInnen in der Mediathek bzgl. Vorhandensein, Reihenfolge und
  Abkürzung von Vor- und Nachnamen variieren kann. Außerdem kann die
  KomponistIn auch in anderen Feldern als \glqq{}Composer\grqq{}
  stehen, eventuell als Teil-String (z.B. als Präfix im Feld
  "Title").\\ Implementieren Sie das Verfahren und wenden Sie es auf
  die Mediathek an. Fügen Sie dabei in jedem Track die UUIDs der
  KomponistInnen (und zu Testzwecken auch die zugehörigen
  \glqq{}normierten\grqq{} Namen aus der Liste der KomponistInnen) als
  neues Feld ein.
\item \label{ta2} Analysieren Sie die Tracks, für die keine Zuordnung
  getroffen werden konnte. Können Sie Ihr Verfahren noch weiter
  verfeinern, um mehr Fälle abzudecken?
\item \label{ta3} Gibt es Tracks, denen mehr als eine KomponistIn
  zugeordnet wurde?\\ Analysieren Sie die Gründe. Können Sie Ihr
  Verfahren modifizieren, um diese Mehrdeutigkeiten aufzulösen?
\item \label{ta4} Gibt es KomponistInnen in der Mediathek, die nicht
  in der Liste der KomponistInnen aus Klassika vorkommen? Können Sie
  die nach-recherchieren und in der Liste ergänzen?
\end{enumerate}

\subsection*{Lösungsansatz}
\label{subsec:loesungsansazu}
Die Aufgabenstellung definiert mehrere konkrete Anforderungen, die bei
der Umsetzung berücksichtigt werden müssen. Prinzipiell geht es darum,
dass jedem Track dessen Komponist zugeordnet werden muss und dies
möglichst eindeutig. Die Informationen die dafür zur Verfügung stehen
befinden sich in der aufbearbeiteten semantisch aussagekräftigen
Mediathek sowie in einer separaten Komponistenliste.\\
Um eine entsprechende Anwendung zu implementieren, müssen die Fragen
aus den Teilaufgaben \ref{ta1}, \ref{ta2} und \ref{ta3} vorab geklärt
werden. Teilaufgabe \ref{ta4} entspricht einer einfachen Recherche
sofern man nicht identifizierte Komponisten extrahieren kann. Im
Folgenden werden nun die einzelnen Teilaufgaben abgehandelt, in
Zusammenhang gebracht und Umsetzungsmöglichkeiten erörtert. Der
generelle Aufbau ist in Abbildung \ref{fig:ablauf} dargestellt.

\begin{figure}[htbp]
  \centering
  \includegraphics[width = .65\textwidth]{a3_ablauf}
  \caption{Schematischer Ablauf des Lösungsansatzes}
  \label{fig:ablauf}
\end{figure}

\subsubsection*{Wann meinen zwei Namen dieselbe Person?}
\label{sec:wann-sind-entspr}
Die Frage, wann zwei Namen auch dieselbe Person meinen ist ohne
zusätzliche Informationen nicht zu beantworten. Selbst bei gleichem
Vornamen und Nachnamen kann bei einer Zuweisung nie von einer
absoluten Richtigkeit der Aussage ausgegangen werden, da man nicht
sicher sein kann ob es nicht auch einen anderen Menschen mit demselben
Namen gegeben hat oder noch gibt.\\
Unter der Einschränkung, dass man lediglich Komponisten betrachtet
minimiert sich die Fehlerwahrscheinlichkeit maßgeblich, da sich die
Grundgesamtheit der möglichen Namen doch wesentlich verringert. Zudem
sind in einigen Fällen noch das Geburts- und das Sterbejahr des
Komponisten vorhanden was den möglichen Fehler weiter
minimiert.\\
Für die Aufgabe ist es aber unabdingbar erstmal zu definieren, wann
die Zuweisung Komponist A $=$ Komponist B gilt. Eine sinnvolle
Zuweisungslogik wurde unter der Annahme, dass alle Namen normiert sind
d.h. nur ASCII-Zwichen enthalten (Beispiel: Herbärt entspricht
Herbaert), in den Pseudocode-Regeln von \ref{eq:1} bis \ref{eq:6}
definiert.

\begin{align}
  A = B \Leftrightarrow & (A.Nachname = B.Nachname \land
  A.Vorname = B.Vorname) \lor \label{eq:1}\\
  & (A.Nachname = B.Nachname \land A.Geburtsjahr = B.Geburtsjahr \land
  \nonumber \\
  & A.Todesjahr = B.Todesjahr) \lor \label{eq:2}\\
  & (A.Nachname \neq B.Nachname \land A.Vorname \neq B.Vorname \land
  \nonumber\\
  & concat(A.Vorname,\text{ `` ''}, A.Nachname) =
  concat(B.Vorname, \text{ `` ''}, B.Nachname)) \lor \label{eq:3}\\
  & (\overline{contains(A.Vorname)} \land A.Nachname = B.Nachname)
  \label{eq:4}\\
  & (A.Nachname \neq B.Nachname \land \nonumber\\
  & (A.Nachname \text{ starts-with } B.Nachname \lor
  (B.Nachname \text{ starts-with } A.Nachname))\label{eq:5}\\
  & (A.Nachname = B.Nachname \land \nonumber\\
  & (A.Vorname \text{ starts-with } B.Vorname \lor
  (B.Vorname \text{ starts-with } A.Vorname))\label{eq:6}
\end{align}

\subsubsection*{Wie kann erkannt werden, dass ein Komponist einen Track komponiert hat?}
\label{sec:wie-kann-erkannt}
Wie kann man überhaupt einem Track einen Komponisten zuweisen, wenn
die Informationen die man zur Verfügung hat lediglich Zeichenketten
sind die keiner formalen Ordnung folgen und zudem
redundante und verwirrende Daten enthalten?\\
Das wohl größte Problem hierbei ist, dass es keine formale Ordnung in
den Feldern gibt d.h. ein Albumname oder der Eintrag im Feld Composer
hat keine klar definierte Struktur aus der man den Komponisten
einheitlich extrahieren könnte. Deshalb muss man auf Heuristiken
zurückgreifen um trotzdem sinnvolle Informationen zu gewinnen.

\begin{enumerate}
\item \label{item:1} \textit{Brute Force Ansatz:} Jeder Komponist wird
  auf jeden Track gemäß den Regeln die im Abschnitt
  \ref{sec:wann-sind-entspr} definiert wurden abzubilden versucht. Die
  Abbildung erfolgt durch ein einfaches testen, ob der Name an irgend
  einer Stelle in der Zeichenkette auftaucht. Wenn ja, hat der
  Komponist den Track
  komponiert, ansonsten nicht.\\
  Dieser Ansatz wäre sehr leicht umsetzbar und auch gerechtfertigt,
  wenn ein gültiger Komponist nicht gleichzeitig auch als Interpret in
  den Feldern auftauchen könnte. Dadurch, dass dies aber der Fall sein
  kann (Beispiel: ``Beethoven plays Bach'') generiert dieser Ansatz
  Falschzuweisungen und genügt zudem nicht den Anforderungen aus
  Teilaufgabe \ref{ta3}, die eine möglichst eindeutige Zuweisung
  erfordert.

\item \label{item:2} \textit{Regular Expression Matching:} Um dem
  Problem der Mehrdeutigkeit der Zuweisungen aus dem Weg zu gehen und
  eine möglichst hohe Güte bei der Zuweisung von Komponisten zu Tracks
  zu gewährleisten kann ein zweiter Ansatz gewählt werden. Bei diesem
  wird versucht die bestehenden Zeichenketten, die Daten zum
  Komponisten enthalten, in reguläre Ausdrücke zu gießen. Dadurch ist
  die Struktur der Zeichenkette bekannt und die Anwendung weiß in
  welchem Teilstring sich brauchbare Informationen befinden.\\
  Das Problem bei diesem Ansatz ist, dass man aufgrund der aktuellen
  Datenbasis reguläre Ausdrücke definieren kann, die diese auch
  optimal abbilden und keine richtig-falschen bzw. falsch-richtigen
  Komponisten findet. Dazu muss aber die Datenbasis bekannt sein.\\
  Hat man nun die Komponisteninformationen aus einem Track extrahiert,
  können diese nun wieder gemäß den Regeln aus Abschnitt
  \ref{sec:wann-sind-entspr} den Komponisten aus der Komponistenliste
  zugewiesen werden.
\end{enumerate}

Bei der Umsetzung für die Aufgabe haben wir uns für Variante
\ref{item:2} entschieden, da alle Voraussetzungen diese zu verwenden
gegeben sind und leichter für die Teilaufgaben \ref{ta2} und \ref{ta3}
angepasst werden kann.

\subsubsection*{In welchen Feldern der Tracks stehen Informationen zu
  Komponisten und in welcher Form?}
\label{sec:welchen-feldern-der}

Informationen zum Komponisten eines Tracks finden sich in drei
unterschiedlichen Tags:
\begin{enumerate}
\item \textit{Composer:} Manche Tracks beinhalten ein Feld
  ``Composer'' indem Informationen wie Nachname, Vorname, Geburtsjahr
  und Sterbejahr des Komponisten enthalten sind. Es kann aber auch
  sein, dass mehrere Komponisten aufgelistet werden.
\item \textit{Album:} Das Feld ``Album'' beschreibt den Albumnamen
  eines Tracks. In manchen Fällen befindet sich in Album aber ein
  führendes Präfix der Form ``Präfix: <wirklicher Albumname>''.  Das
  Präfix beinhaltet nun manchmal den Vornamen und den Nachnamen,
  manchmal nur den Nachnamen oder die Nachnamen mehrerer
  Komponisten.
\item \textit{Name:} Im Feld ``Name'' befindet sich der Titel des
  Tracks. Oftmals beinhaltet auch dieser Informationen zum Komponisten
  ebenfalls wieder durch ein Präfix vom Rest des Titels
  getrennt. Dieses Präfix kann nun wieder wie bei Album Vornamen
  und/oder Nachnamen des Komponisten enthalten.
\end{enumerate}

Die Form, wie die Komponisteninformation vorliegt ist sehr
unterschiedlich. Es kann vorkommen, dass der Vorname nur als Folge von
Initialen vorliegt, die aneinander hängen oder durch einen Punkt
getrennt sind. Dieselben Vornamen oder Nachnamen können nun wieder
unterschiedlich geschrieben sein oder einmal mit Sonderzeichen
versehen sein oder nicht. Eine Normierung einer Zeichenkette für einen
effektiven und sinnvollen Vergleich ist deshalb dringend notwendig.

\subsubsection*{In welchen Fällen werden einem Track mehrere Komponisten zugewiesen?}
\label{sec:welch-fall-werd-1}
Nicht jedes Musikstück wird von einem einzigen Komponisten
komponiert. Es muss deshalb nicht falsch sein, dass einem Track
mehrere Komponisten zugewiesen werden. Dies ist auch in der Mediathek
oftmals der Fall.\\
Das bedeutet aber nicht automatisch, dass wenn einem Track mehrere
Komponisten zugewiesen werden das auch automatisch bedeutet, dass alle
auch wirklich an der Komposition beteiligt waren. Probleme bestehen
genau dann, wenn zu wenig Informationen vorhanden sind um einen
Komponisten eindeutig zu identifizieren. Deshalb werden gemäß den
Selektionsregeln aus Abschnitt \ref{sec:wann-sind-entspr} alle
Komponisten in die Ausgabe übernommen welche den aufgelisteten
Kriterien genügen.\\ Dadurch entstehen Gruppen von Komponisten von
denen nur einer der ``wahre'' Komponist ist. Die Entscheidung welcher
das ist, kann von der Anwendung nicht getroffen werden sondern wird
dem Benutzer überlassen. Dies kann entweder über eine weitere dafür
ausgelegte Anwendung passieren oder manuell über die nach der
Durchführung entstehende neue Mediathek.

\subsection*{Lösung}
Für die Umsetzung des in Abschnitt \ref{subsec:loesungsansazu}
vorgestellten Ansatzes wurde die Abfragesprache XQuery verwendet.\\
Im Grunde kann die Aufgabenstellung als Join zwischen zwei Relationen
gesehen werden, mit dem Unterschied, dass die Relationen als
XML-Dokument mit fest definiertem Schema vorliegen. Der Join besteht
darin, dass man alle Namen der Komponisten in der Mediathek suchen
muss, die einen Track in derselben komponiert haben und sich auch in
der Komponistenliste befinden. Das Join-Attribut ist der Name des
Komponisten.\\
Sind die zugehörigen Elemente gefunden, werden in der Mediathek die
IDs der Komponisten eingefügt welche damit eine Art
Fremdschlüssel darstellen.\\
Deshalb wurde die Anwendung von XQuery als intuitiver betrachtet und
XSLT vorgezogen.\\
Der Ablauf der Anwendung ist in Abbildung \ref{fig:a3_sequenzdiagramm}
schematisch dargestellt. Der in Abschnitt \ref{subsec:loesungsansazu}
vorgestellte Lösungsansatz wurde dabei vollständig umgesetzt.

\begin{figure}[htbp]
  \centering
  \includegraphics[width = .6\textwidth]{a3_Sequenzdiagramm}
  \caption{Sequenzdiagramm der Anwendung: Die dargestellten Parser
    sind zuständig für die Umwandlung des jeweiligen Tag-Inhaltes der
    Mediathek in ein wohlgeformtes Komponistentag. Das Objekt
    SearchValidComposers ist für das Suchen von Komponisten in der
    Komponistenliste zuständig, die dem Komponistenelement, die die
    Parser zurückliefern entsprechen.}
  \label{fig:a3_sequenzdiagramm}
\end{figure}

Die Tracks in der Mediathek, die nach dem Beenden der Anwendung
vorliegt, verfügt über ein zusätzliches Feld \textit{Assignments}, das
die dem Track zugewiesenen Komponisten-UUIDs enthält. Das Attribut
\textit{groupCompound} beinhaltet den Namen und den Vornamen der aus
dem Track extrahierten Komponistennamen. Alle Komponistennamen
innerhalb eines Assignments-Feldes haben die Werte aus groupCompound
gemeinsam.\\
Befinden sich nun in einem Track mehrere Assignments-Felder, so
bedeutet dies, dass mindestens eines davon den richtigen Komponisten
beinhaltet, es aber nicht ausgeschlossen ist, dass auch mehrere
Komponisten innerhalb der Assignments das Stück gemeinsam komponiert
haben. Innerhalb eines Assignments-Feldes kann es nun wieder mehrere
Komponisten geben. Dies ist aber nur deshalb der Fall, da nicht
genügend Informationen zur eindeutigen Identifikation des Komponisten
gefunden wurde. Das heißt, dass aus jedem Assignments-Feld nur genau
einer der Komponisten der richtige ist. Diese Auswahl wird,
wie schon im Lösungsansatz angedeutet, dem Benutzer überlassen.\\
Es kam teilweise vor, dass Komponisten aus der Mediathek nicht in der
Komponistenliste gefunden wurden. Diese wurden recherchiert und
nachträglich manuell in die Datenbasis eingefügt. Insgesamt wurden 17
neue Komponisten eingetragen.


%%% Local Variables: 
%%% mode: latex
%%% TeX-master: "../documentation"
%%% End: 
